package com.starhub.system.database.executor;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import javax.sql.DataSource;
import java.sql.Connection;
import java.util.List;
import java.util.Map;

/**
 * SQL执行器
 */
@Slf4j
@Component
public class SqlExecutor {
    
    @Autowired
    private DataSource dataSource;
    
    @Autowired
    private JdbcTemplate jdbcTemplate;
    
    /**
     * 执行SQL文件内容
     */
    @Transactional
    public boolean executeSql(String sqlContent, String scriptName) {
        if (sqlContent == null || sqlContent.trim().isEmpty()) {
            log.warn("SQL文件内容为空: {}", scriptName);
            return false;
        }
        
        try {
            // 分割SQL语句（按分号分割）
            String[] sqlStatements = splitSqlStatements(sqlContent);
            
            for (String sql : sqlStatements) {
                sql = sql.trim();
                if (!sql.isEmpty()) {
                    log.debug("执行SQL语句: {}", sql);
                    
                    // 根据SQL类型选择执行方式
                    if (sql.toLowerCase().startsWith("select")) {
                        // SELECT语句使用queryForList
                        List<Map<String, Object>> result = jdbcTemplate.queryForList(sql);
                        log.debug("SELECT语句执行结果: {} 行", result.size());
                    } else if (sql.toLowerCase().startsWith("insert") || 
                               sql.toLowerCase().startsWith("update") || 
                               sql.toLowerCase().startsWith("delete") ||
                               sql.toLowerCase().startsWith("create") ||
                               sql.toLowerCase().startsWith("alter") ||
                               sql.toLowerCase().startsWith("drop")) {
                        // DML/DDL语句使用execute
                        jdbcTemplate.execute(sql);
                        log.debug("DML/DDL语句执行成功");
                    } else {
                        // 其他语句使用execute
                        jdbcTemplate.execute(sql);
                        log.debug("其他SQL语句执行成功");
                    }
                }
            }
            
            //log.info("【{}】SQL文件执行成功", scriptName);
            return true;
            
        } catch (Exception e) {
            //log.error("【{}】SQL文件执行失败:", scriptName, e.getMessage(), e);
            return false;
        }
    }
    
    /**
     * 分割SQL语句
     */
    private String[] splitSqlStatements(String sqlContent) {
        // 简单的按分号分割，实际项目中可能需要更复杂的SQL解析
        return sqlContent.split(";");
    }
    
    /**
     * 测试数据库连接
     */
    public boolean testConnection() {
        try (Connection connection = dataSource.getConnection()) {
            return connection.isValid(5);
        } catch (Exception e) {
            log.error("数据库连接测试失败: {}", e.getMessage(), e);
            return false;
        }
    }
    
    /**
     * 获取数据库类型
     */
    public String getDatabaseType() {
        try (Connection connection = dataSource.getConnection()) {
            String productName = connection.getMetaData().getDatabaseProductName();
            if (productName.toLowerCase().contains("mysql")) {
                return "mysql";
            } else if (productName.toLowerCase().contains("postgresql")) {
                return "postgresql";
            } else if (productName.toLowerCase().contains("oracle")) {
                return "oracle";
            } else if (productName.toLowerCase().contains("sql server")) {
                return "sqlserver";
            } else {
                return productName.toLowerCase();
            }
        } catch (Exception e) {
            log.error("获取数据库类型失败: {}", e.getMessage(), e);
            return "unknown";
        }
    }
} 